{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Cycle GAN in PyTorch"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "%load_ext autoreload\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "%autoreload 2\n",
    "\n",
    "from IPython import display\n",
    "\n",
    "from utils import Logger\n",
    "\n",
    "import os, urllib, zipfile, itertools\n",
    "from tqdm import tqdm\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "import torch\n",
    "from torch import nn, optim\n",
    "from torch.autograd.variable import Variable\n",
    "from torchvision import transforms, datasets"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Download data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "DATA_FOLDER = './torch_data/CycleGAN'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "VALID_DATA_NAMES = [\"ae_photos\", \"apple2orange\", \"summer2winter_yosemite\", \"horse2zebra\", \"monet2photo\", \"cezanne2photo\", \"ukiyoe2photo\", \"vangogh2photo\", \"maps\", \"cityscapes\",\"facades\",\"iphone2dslr_flower\",\"mini\", \"mini_pix2pix\", \"mini_colorization\"]\n",
    "\n",
    "URL = 'https://people.eecs.berkeley.edu/~taesung_park/CycleGAN/datasets/{}.zip'\n",
    "class DownloadProgressBar(tqdm):\n",
    "    def update_to(self, b=1, bsize=1, tsize=None):\n",
    "        if tsize is not None:\n",
    "            self.total = tsize\n",
    "        self.update(b * bsize - self.n)\n",
    "\n",
    "def rename_images(rootdir):\n",
    "    for subdir, dirs, files in os.walk(rootdir):\n",
    "        idx = 0\n",
    "        for file in files:\n",
    "            file_path = os.path.join(subdir, file)\n",
    "            new_file_path = os.path.join(subdir, \"{}.jpg\".format(idx))\n",
    "            os.rename(file_path, new_file_path)\n",
    "            idx = idx + 1\n",
    "        \n",
    "def download_cyclegan_dataset(filename, path, force=False):\n",
    "    # Validate dataset filename is valid.\n",
    "    assert(filename in VALID_DATA_NAMES)\n",
    "    # Return if path exists.\n",
    "    file_path = \"{}/{}.zip\".format(path, filename)\n",
    "    if os.path.exists(file_path) and not force: return\n",
    "    # Otherwise download.\n",
    "    \n",
    "    # Make path directory if missing.\n",
    "    os.makedirs(path, exist_ok=True)\n",
    "    # Download data\n",
    "    url = URL.format(filename)\n",
    "    with DownloadProgressBar(unit='B', unit_scale=True,\n",
    "                             miniters=1, desc=url.split('/')[-1]) as t:\n",
    "        urllib.request.urlretrieve(url, file_path, reporthook=t.update_to)\n",
    "        with zipfile.ZipFile(file_path, 'r') as zip_obj:\n",
    "            zip_obj.extractall(path)\n",
    "    rename_images(os.path.join(path, filename))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "for name in VALID_DATA_NAMES:\n",
    "    download_cyclegan_dataset(name, DATA_FOLDER, force=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Create Dataset Class"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "from torch.utils.data import Dataset\n",
    "from PIL import Image\n",
    "from skimage import io\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "class CycleGanDataset(Dataset):\n",
    "    \"\"\"My dataset.\"\"\"\n",
    "    \n",
    "    def __init__(self, path, transform=None):\n",
    "        self._path = path\n",
    "        self.num_files = len(os.listdir(self._path))\n",
    "        self.transform = transform\n",
    "\n",
    "    def __len__(self):\n",
    "        return self.num_files\n",
    "    \n",
    "    def filename(self, idx):\n",
    "        for directory in [\"trainA\", \"testA\"]:\n",
    "            possible_path = os.path.join(self._path, directory, \"{}.jpg\".format(str(idx)))\n",
    "            if os.path.exists(possible_path):\n",
    "                return possible_path\n",
    "\n",
    "    def __getitem__(self, idx):\n",
    "        # Handle vectors.\n",
    "        if torch.is_tensor(idx):\n",
    "            idx = idx.tolist()\n",
    "        img_name = self.filename(idx)\n",
    "        print(img_name)\n",
    "        image = Image.fromarray(io.imread(img_name))\n",
    "        if self.transform:\n",
    "            image = self.transform(image)\n",
    "        return image\n",
    "\n",
    "    def visualize(self, idx):\n",
    "        np_img = np.transpose(self[idx].numpy(), (1,2, 0))\n",
    "        plt.imshow(np_img)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Load Data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "def load_cyclegan_dataset():\n",
    "    compose = transforms.Compose(\n",
    "        [transforms.Resize((80, 80)),\n",
    "         transforms.ToTensor(),\n",
    "         transforms.Normalize((.5,), (.5,))\n",
    "        ])\n",
    "    return CycleGanDataset(DATA_FOLDER + \"/ae_photos\", transform=compose)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n",
      "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "./torch_data/CycleGAN/ae_photos/testA/101.jpg\n",
      "./torch_data/CycleGAN/ae_photos/testA/101.jpg\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "data_A = load_cyclegan_dataset()\n",
    "data_B = load_cyclegan_dataset()\n",
    "\n",
    "# Safety check visualization.\n",
    "data_A.visualize(101)\n",
    "data_B.visualize(101)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Discriminator "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "class DiscriminatorNet(torch.nn.Module):\n",
    "    \n",
    "    def __init__(self):\n",
    "        super(DiscriminatorNet, self).__init__()\n",
    "        self.conv_0 = nn.Sequential(\n",
    "            nn.Conv2d(in_channels=3, out_channels=64,\n",
    "                                   kernel_size=(4, 4), stride=2),\n",
    "            nn.LeakyReLU(negative_slope=0.2, inplace=True)\n",
    "        )\n",
    "        self.conv_1 = nn.Sequential(\n",
    "            nn.Conv2d(in_channels=64, out_channels=128,\n",
    "                                   kernel_size=(4, 4), stride=2),\n",
    "            nn.BatchNorm2d(128),\n",
    "            nn.LeakyReLU(negative_slope=0.2, inplace=True)\n",
    "        )\n",
    "        self.conv_2 = nn.Sequential(\n",
    "            nn.Conv2d(in_channels=128, out_channels=256,\n",
    "                                   kernel_size=(4, 4), stride=2),\n",
    "            nn.BatchNorm2d(256),\n",
    "            nn.LeakyReLU(negative_slope=0.2, inplace=True)\n",
    "        )\n",
    "        self.conv_3 = nn.Sequential(\n",
    "            nn.Conv2d(in_channels=256, out_channels=512,\n",
    "                                   kernel_size=(4, 4), stride=2),\n",
    "            nn.BatchNorm2d(512),\n",
    "            nn.LeakyReLU(negative_slope=0.2, inplace=True)\n",
    "        )\n",
    "        self.conv_out = nn.Conv2d(in_channels=512, out_channels=1,\n",
    "                             kernel_size=(4, 4), stride=2)\n",
    "    \n",
    "    def forward(self, x):\n",
    "        x = self.conv_0(x)\n",
    "        x = self.conv_1(x)\n",
    "        x = self.conv_2(x)\n",
    "        x = self.conv_3(x)\n",
    "        x = self.conv_out(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "Dis_a = DiscriminatorNet()\n",
    "Dis_b = DiscriminatorNet()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Generator net"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "class GeneratorNet(torch.nn.Module):\n",
    "    \n",
    "    def __init__(self):\n",
    "        super(GeneratorNet, self).__init__()\n",
    "        \n",
    "        # c7s1-64\n",
    "        self.conv_0 = nn.Sequential(\n",
    "            nn.Conv2d(in_channels=3, out_channels=64, kernel_size=(7, 7), stride=1, \n",
    "                      padding_mode='reflect'),\n",
    "            nn.BatchNorm2d(64),\n",
    "            nn.ReLU(inplace=True)\n",
    "        )\n",
    "        # d128\n",
    "        self.conv_1 = nn.Sequential( \n",
    "            nn.Conv2d(in_channels=64, out_channels=128, kernel_size=(3, 3), stride=2,\n",
    "                      padding_mode='reflect'),\n",
    "            nn.BatchNorm2d(64),\n",
    "            nn.ReLU(inplace=True)\n",
    "        )\n",
    "        # d256\n",
    "        self.conv_2 = nn.Sequential(\n",
    "            nn.Conv2d(in_channels=128, out_channels=256, kernel_size=(3, 3), stride=2,\n",
    "                     padding_mode='reflect'),\n",
    "            nn.BatchNorm2d(64),\n",
    "            nn.ReLU(inplace=True)\n",
    "        )\n",
    "        # R256\n",
    "        self.res_3 = nn.Conv2d(in_channels=256, out_channels=256, kernel_size=(3, 3),\n",
    "                               stride=2),\n",
    "        # R256\n",
    "        self.res_4 = nn.Conv2d(in_channels=256, out_channels=256, kernel_size=(3, 3),\n",
    "                               stride=2),\n",
    "        # R256\n",
    "        self.res_5 = nn.Conv2d(in_channels=256, out_channels=256, kernel_size=(3, 3),\n",
    "                               stride=2),\n",
    "        # R256\n",
    "        self.res_6 = nn.Conv2d(in_channels=256, out_channels=256, kernel_size=(3, 3),\n",
    "                               stride=2),\n",
    "        # R256\n",
    "        self.res_7 = nn.Conv2d(in_channels=256, out_channels=256, kernel_size=(3, 3),\n",
    "                               stride=2),\n",
    "        # R256\n",
    "        self.res_8 = nn.Conv2d(in_channels=256, out_channels=256, kernel_size=(3, 3),\n",
    "                               stride=2),\n",
    "        # u128\n",
    "        self.ups_9 = nn.Sequential(\n",
    "            nn.ConvTranspose2d(in_channels=256, out_channels=128, \n",
    "                               kernel_size=(3, 3), stride=0.5),\n",
    "            nn.BatchNorm2d(128),\n",
    "            nn.ReLU(inplace=True)\n",
    "        )\n",
    "        # u64\n",
    "        self.ups_10 = nn.Sequential(\n",
    "            nn.ConvTranspose2d(in_channels=128, out_channels=64, kernel_size=(3, 3), \n",
    "                               stride=0.5),\n",
    "            nn.BatchNorm2d(64),\n",
    "            nn.ReLU(inplace=True)\n",
    "        )\n",
    "        # c7s1-3\n",
    "        self.conv_0 = nn.Sequential(\n",
    "            nn.Conv2d(in_channels=3, out_channels=3, kernel_size=(7, 7), stride=1, \n",
    "                      padding_mode='reflect'),\n",
    "            nn.BatchNorm2d(64),\n",
    "            nn.ReLU(inplace=True)\n",
    "        )\n",
    "        \n",
    "    # TODO(diegoalejogm): Add skip layer connections.    \n",
    "    def forward(self, x):\n",
    "        x = self.conv_0(x)\n",
    "        x = self.conv_1(x)\n",
    "        x = self.conv_2(x)\n",
    "        x = self.res_3(x)\n",
    "        x = self.res_4(x)\n",
    "        x = self.res_5(x)\n",
    "        x = self.res_6(x)\n",
    "        x = self.res_7(x)\n",
    "        x = self.res_8(x)\n",
    "        x = self.ups_9(x)\n",
    "        x = self.ups_10(x)\n",
    "        x = self.conv_11(x)\n",
    "        return x\n",
    "        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "Gen_a2b = GeneratorNet()\n",
    "Gen_b2a = GeneratorNet()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Optimization"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### CUDA"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "loss = nn.BCELoss()\n",
    "gan_loss_f = nn.MSELoss()\n",
    "cycle_loss_f = nn.L1Loss()\n",
    "\n",
    "g_optimizer = torch.optim.Adam(itertools.chain(Gen_a2b.parameters(), Gen_b2a.parameters()), lr=0.0002, betas=(0.5, 0.999))\n",
    "\n",
    "d_optimizer = torch.optim.Adam(itertools.chain(Dis_a.parameters(), Dis_b.parameters()), lr=0.0002, betas=(0.5, 0.999))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "def real_data_label(size):\n",
    "    '''\n",
    "    Tensor containing ones, with shape = size\n",
    "    '''\n",
    "    data = Variable(torch.ones(size, 1))\n",
    "    if torch.cuda.is_available(): return data.cuda()\n",
    "    return data\n",
    "\n",
    "def fake_data_label(size):\n",
    "    '''\n",
    "    Tensor containing ones, with shape = size\n",
    "    '''\n",
    "    data = Variable(torch.zeros(size, 1))\n",
    "    if torch.cuda.is_available(): return data.cuda()\n",
    "    return data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "def train_generator(gan_loss_f, cycle_loss_f, \n",
    "                    generator_a2b, generator_b2a, \n",
    "                    real_data, fake_data, lambd):\n",
    "    \n",
    "    def adversarial_loss(loss_fn, fake_data):\n",
    "        # Calculate loss for D(G(x)), x being a \"fake\" sample, treating it as positive.\n",
    "        prediction = discriminator(fake_data)\n",
    "        return loss_fn(prediction, real_data_label(fake_data.size(0)))\n",
    "    \n",
    "    def cycle_loss(loss_fn, lambd, generator_first, generator_second, real_data):\n",
    "        # Calculate loss for cycle F(G(x)), compared to `real_data` sample.\n",
    "        fake_data = generator_first(real_data)\n",
    "        recons_data = generator_second(fake_data)\n",
    "        return loss_fn(recons, recons_data) * lambd\n",
    "    \n",
    "    optimizer.zero_grad()\n",
    "\n",
    "    # Calculate adversarial loss for each generator.\n",
    "    gen_A_loss = adversarial_loss()\n",
    "    gen_B_loss = adversarial_loss()\n",
    "    \n",
    "    # Calculate Cycle consistency loss for generators in each domain (A, B).\n",
    "    cycle_loss_A = cycle_loss()\n",
    "    cycle_loss_B = cycle_loss()\n",
    "    \n",
    "    # Compute full generator loss.\n",
    "    gen_full_loss = (\n",
    "        (gen_A_loss + gen_B_loss) + # Generator loss \n",
    "        (cycle_loss_A + cycle_loss_B) # Cycle consistency loss\n",
    "    )\n",
    "\n",
    "    # Back propagate the loss.\n",
    "    gen_full_loss.backward()\n",
    "    g_optimizer.step()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "def train_discriminator():\n",
    "    \n",
    "    def adversarial_loss(loss_fn, discriminator, real_data, fake_data):\n",
    "        # Calculate loss for D(G(x)), x being a \"fake\" sample.\n",
    "        prediction = discriminator(fake_data)\n",
    "        loss_fake_data = loss_fn(prediction, fake_data_label(fake_data.size(0)))\n",
    "        \n",
    "        # Calculate loss for D(G(x)), x being a \"real\" sample.\n",
    "        prediction_real = discriminator(real_data)\n",
    "        loss_real_data = loss_fn(prediction, real_data_label(real_data.size(0)))\n",
    "        \n",
    "        return loss_fake_data + loss_real_data\n",
    "    \n",
    "    optimizer.zero_grad()\n",
    "    \n",
    "    # Compute adversarial loss for each discriminator.\n",
    "    disc_A_loss = adversarial_loss()\n",
    "    disc_B_loss = adversarial_loss()\n",
    "    \n",
    "    # Compute full discriminator loss.\n",
    "    disc_full_loss = disc_A_loss + disc_B_loss\n",
    "\n",
    "    # Backward propagate.\n",
    "    disc_full_loss.backward()\n",
    "    optimizer.step()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "ename": "IndentationError",
     "evalue": "expected an indented block (<ipython-input-26-90b6f5a53e4d>, line 4)",
     "output_type": "error",
     "traceback": [
      "\u001b[0;36m  File \u001b[0;32m\"<ipython-input-26-90b6f5a53e4d>\"\u001b[0;36m, line \u001b[0;32m4\u001b[0m\n\u001b[0;31m    for i, (a_real, b_real) in enumerate(zip(data_A, data_B)):\u001b[0m\n\u001b[0m      ^\u001b[0m\n\u001b[0;31mIndentationError\u001b[0m\u001b[0;31m:\u001b[0m expected an indented block\n"
     ]
    }
   ],
   "source": [
    "# num_epochs = 100\n",
    "\n",
    "# for epoch in range(num_epochs):\n",
    "# for i, (a_real, b_real) in enumerate(zip(data_A, data_B)):\n",
    "#     a_real = Variable(a_real[0])\n",
    "#     b_real = Variable(b_real[0])\n",
    "#     a_real, b_real = utils.cuda([a_real, b_real])\n",
    "\n",
    "#     a_fake = self.G_b2a(b_real)\n",
    "#     b_fake = self.G_a2b(a_real)\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
